/*
 * Copyright 2002-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.servlet.config.annotation;

import java.util.List;

import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;

/**
 * An implementation of {@link WebMvcConfigurer} with empty methods allowing
 * subclasses to override only the methods they're interested in.
 *
 * @author Rossen Stoyanchev
 * @since 3.1
 */
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {

	/**设置路径匹配属性
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
	}

	/**配置内容协商管理器
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
	}

	/**异步请求相关主持
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
	}

	/**提供DataBinder中的格式与类型转化器注册功能。在注册@InitBinder标记的方法中，可以为本次请求关联的WebDataBinder提供自定义格式与类型转换器。而在这里，通过FormatterRegistry的addFormatter方法与addConverter方法可以添加全局的格式转换器与类型转换器
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addFormatters(FormatterRegistry registry) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
	}

	/**用于注册资源处理器。资源处理器用于支持为指定路径模式返回本地的静态资源。当返回静态资源时，无须经过视图与模型的解析，直接把资源的数据流写入响应中，此种方式可节省处理时间。
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
	}

	/**提供跨域请求全局配置注册器。通过CorsRegistry的addMapping添加全局跨域请求映射，传入路径模式参数，返回该路径对应的跨域请求注册器。在该跨域注册器中，可以通过allowedOrigins和allowedHeaders等方法设置与跨域请求相关的参数
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addCorsMappings(CorsRegistry registry) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
	}

	/**用于配置与注册视图解析器
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
	}

	/**添加参数解析器，在该方法中添加的参数解析器会放在大部分默认的参数解析器后面，但其放在提供默认解析参数的两个参数解析器前面，即放在无须注解的RequestParam参数和无须注解的ModelAttribute的参数解析器前面
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
	}

	/**用于配置所有的消息转换器。当通过此方式提供配置消息转换器时，会覆盖默认的消息转换器配置，可能会导致一些默认消息转换器无法使用，故需慎用此方式。如需扩展消息转换器，请使用extendMessageConverters
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
	}

	/**用于扩展消息转换器，与extendHandlerExceptionResolvers类似，传入的list参数已经包含了当前所有的默认消息转换器，在方法逻辑中，可以对该list进行排序、添加、删除元素等操作，完全自定义消息转换器
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
	}

	/**用于配置处理器异常解析器，使用此方式会覆盖默认的异常解析器，需慎用。如需扩展默认的异常处理器，可使用extendHandlerExceptionResolvers方法
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
	}

	/**用于扩展处理器异常解析器，在该方法中，传入的list参数已经包含了当前所有的默认异常解析器，在方法逻辑中，可以对该list进行排序、添加元素、删除元素等操作，可以完全自定义异常解析器
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
	}

	/**获取校验器，用于对各种数据进行校验。在参数绑定时用到此功能，对处理器的方法参数值进行数据校验，在WebDateBinder中也会使用该校验器。此方法如果提供了返回值，则会把返回的Validator作为全局校验器使用。通过@InitBinder注解也可以为WebDataBinder添加校验器
	 * {@inheritDoc}
	 * <p>This implementation returns {@code null}.
	 */
	@Override
	public Validator getValidator() {
		return null;
	}

	/**用于对数据绑定的错误进行解析，通过该解析器可以获取解析后的消息状态码，用于对绑定错误的情况进行自定义返回
	 * {@inheritDoc}
	 * <p>This implementation returns {@code null}.
	 */
	@Override
	public MessageCodesResolver getMessageCodesResolver() {
		return null;
	}

}
